home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / byt85may.lbr / NIM.BQS / NIM.BAS
BASIC Source File  |  1985-09-15  |  3KB  |  89 lines

  1. 10 '***********************************************
  2. 20 '*                   NIM                       *
  3. 30 '*            BY BOB KUROSAKA                  *
  4. 40 '***********************************************
  5. 50 CLS
  6. 60 DEFINT A-Z:VICTORY$="NO"
  7. 70 REM DEFINE INITIAL BOARD CONDITIONS
  8. 80 INPUT "ENTER THE NUMBER OF ROWS (3<=ROWS<=18)";ROWS
  9. 90 IF ROWS<3 OR ROWS>18 THEN                                                                 PRINT "MUST BE BETWEEN 3 AND 18":GOTO 80
  10. 100 DIM ROW(ROWS)
  11. 110 FOR I=1 TO ROWS
  12. 120     PRINT "ENTER NUMBER OF OBJECTS (1 TO 59) IN ROW ";I
  13. 130     INPUT ROW(I)
  14. 140     IF ROW(I)<1 OR ROW(I)>59 THEN                                                        PRINT "NUMBER MUST BE BETWEEN 1 AND 59":                                        GOTO 120
  15. 150 NEXT I
  16. 160 GOSUB 540:REM DRAW THE BOARD
  17. 170 INPUT "ENTER 1 TO MOVE FIRST, 2 TO MOVE SECOND";MOVE
  18. 180 IF MOVE<1 OR MOVE>2 THEN 170
  19. 190 ON MOVE GOTO 210,340
  20. 200 REM
  21. 210 REM PLAYER'S MOVE SEQUENCE
  22. 220 REM
  23. 230 PLAYER$="YOU"
  24. 240 INPUT "ROW";ROW
  25. 250 IF ROW<1 OR ROW>ROWS THEN PRINT "INVALID ROW":GOTO 240
  26. 260 INPUT "REMOVE";REMOVE
  27. 270 IF REMOVE>ROW(ROW) OR REMOVE<1 THEN                                                         PRINT "INVALID":GOTO 240
  28. 280 ROW(ROW)=ROW(ROW)-REMOVE
  29. 290 GOSUB 540:REM REDRAW BOARD
  30. 300 IF VICTORY$="YES" THEN 500
  31. 310 REM PAUSE LONG ENOUGH TO SEE THE BOARD
  32. 320 FOR I=1 TO 5000:NEXT
  33. 330 REM
  34. 340 REM COMPUTER'S MOVE SEQUENCE
  35. 350 REM
  36. 360 PLAYER$="I"
  37. 370 REM DETERMINE PARITY OF THE BOARD
  38. 380 PARITY=ROW(1)
  39. 390 FOR I=2 TO ROWS
  40. 400     PARITY=(PARITY OR ROW(I)) AND (NOT(PARITY AND ROW(I)))
  41. 410 NEXT I
  42. 420 REM CHOOSE MOVE-SELECTION ROUTINE DEPENDING ON BOARD SAFETY
  43. 430 IF PARITY=0 THEN GOSUB 690 ELSE GOSUB 790
  44. 440 REM DRAW THE NEW BOARD
  45. 450 GOSUB 540
  46. 460 REM ANNOUNCE COMPUTER MOVE
  47. 470 PRINT "I HAVE REMOVED ";REMOVE;" PIECES FROM ROW ";ROW
  48. 480 REM LOOP FOR NEXT MOVE SEQUENCE
  49. 490 IF VICTORY$="NO" THEN 210
  50. 500 END
  51. 510 REM END OF MAIN PROCEDURE
  52. 520 REM BEGINNING OF SUBROUTINES
  53. 530 REM
  54. 540 REM BOARD-DRAWING ROUTINE
  55. 550 REM
  56. 560 CLS
  57. 570 STATUS=0    'HOW MANY ROWS ARE EMPTY?
  58. 580 FOR I=1 TO ROWS
  59. 590    PRINT "ROW ";I;"(";ROW(I);")";TAB(20);
  60. 600    IF ROW(I)=0 THEN STATUS=STATUS+1:GOTO 640
  61. 610    FOR J=1 TO ROW(I)
  62. 620            PRINT "/";
  63. 630    NEXT J
  64. 640    PRINT
  65. 650 NEXT I
  66. 660 IF STATUS=ROWS THEN PRINT PLAYER$;" WON":VICTORY$="YES"
  67. 670 RETURN
  68. 680 REM
  69. 690 REM NO GOOD MOVES ROUTINE
  70. 700 REM
  71. 710 REMOVE=0:ROW=0
  72. 720 WHILE REMOVE=0
  73. 730    ROW=ROW+1
  74. 740    IF ROW(ROW)>0 THEN REMOVE=1
  75. 750 WEND
  76. 760 ROW(ROW)=ROW(ROW)-REMOVE
  77. 770 RETURN
  78. 780 REM
  79. 790 REM FIND THE GOOD MOVE ROUTINE
  80. 800 REM
  81. 810 REMOVE=0:ROW=0
  82. 820 WHILE REMOVE=0
  83. 830    ROW=ROW+1
  84. 840    RETAIN=(ROW(ROW) OR PARITY) AND (NOT(ROW(ROW) AND PARITY))
  85. 850    IF RETAIN<ROW(ROW) THEN REMOVE=ROW(ROW)-RETAIN
  86. 860 WEND
  87. 870 ROW(ROW)=ROW(ROW)-REMOVE
  88. 880 RETURN
  89.